{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ec44e227-6a25-42dd-bef7-175cdd6a69d2",
   "metadata": {},
   "source": [
    "## 决策树和随机森林"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49ea61df-4183-44c3-aa11-d0a0db9182c5",
   "metadata": {},
   "source": [
    "### 决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "80d08e1c-198a-4624-a6df-7fef01a74d0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import tree\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"all\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cc725c7b-353b-4691-85da-0212768d1b56",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1169</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>67</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>5951</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>2096</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>49</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>42</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>7882</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>45</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>24</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>4870</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>53</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>bad</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   checking  duration  history purpose  amount  savings  employed  installp  \\\n",
       "0         1         6        4       3    1169        5         5         4   \n",
       "1         2        48        2       3    5951        1         3         2   \n",
       "2         4        12        4       6    2096        1         4         2   \n",
       "3         1        42        2       2    7882        1         4         2   \n",
       "4         1        24        3       0    4870        1         3         3   \n",
       "\n",
       "   marital  coapp  ...  property  age  other  housing  existcr  job  depends  \\\n",
       "0        3      1  ...         1   67      3        2        2    3        1   \n",
       "1        2      1  ...         1   22      3        2        1    3        1   \n",
       "2        3      1  ...         1   49      3        2        1    2        2   \n",
       "3        3      3  ...         2   45      3        3        1    3        2   \n",
       "4        3      1  ...         4   53      3        3        2    3        2   \n",
       "\n",
       "   telephon  foreign  good_bad  \n",
       "0         2        1      good  \n",
       "1         1        1       bad  \n",
       "2         1        1      good  \n",
       "3         1        1      good  \n",
       "4         1        1       bad  \n",
       "\n",
       "[5 rows x 21 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用pandas导入csv数据，查看前5行导入结果看是否正常\n",
    "import pandas as pd\n",
    "credit_df = pd.read_csv(\"credit.csv\")\n",
    "credit_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e1beaedc-2383-4370-9e16-5f72c9525235",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000 entries, 0 to 999\n",
      "Data columns (total 21 columns):\n",
      " #   Column    Non-Null Count  Dtype \n",
      "---  ------    --------------  ----- \n",
      " 0   checking  1000 non-null   int64 \n",
      " 1   duration  1000 non-null   int64 \n",
      " 2   history   1000 non-null   int64 \n",
      " 3   purpose   1000 non-null   object\n",
      " 4   amount    1000 non-null   int64 \n",
      " 5   savings   1000 non-null   int64 \n",
      " 6   employed  1000 non-null   int64 \n",
      " 7   installp  1000 non-null   int64 \n",
      " 8   marital   1000 non-null   int64 \n",
      " 9   coapp     1000 non-null   int64 \n",
      " 10  resident  1000 non-null   int64 \n",
      " 11  property  1000 non-null   int64 \n",
      " 12  age       1000 non-null   int64 \n",
      " 13  other     1000 non-null   int64 \n",
      " 14  housing   1000 non-null   int64 \n",
      " 15  existcr   1000 non-null   int64 \n",
      " 16  job       1000 non-null   int64 \n",
      " 17  depends   1000 non-null   int64 \n",
      " 18  telephon  1000 non-null   int64 \n",
      " 19  foreign   1000 non-null   int64 \n",
      " 20  good_bad  1000 non-null   object\n",
      "dtypes: int64(19), object(2)\n",
      "memory usage: 164.2+ KB\n"
     ]
    }
   ],
   "source": [
    "credit_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a6f11c2d-6d0e-4100-bafe-7942e36d13d8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>resident</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.577000</td>\n",
       "      <td>20.903000</td>\n",
       "      <td>2.54500</td>\n",
       "      <td>3271.258000</td>\n",
       "      <td>2.105000</td>\n",
       "      <td>3.384000</td>\n",
       "      <td>2.973000</td>\n",
       "      <td>2.68200</td>\n",
       "      <td>1.145000</td>\n",
       "      <td>2.845000</td>\n",
       "      <td>2.358000</td>\n",
       "      <td>35.546000</td>\n",
       "      <td>2.675000</td>\n",
       "      <td>1.929000</td>\n",
       "      <td>1.407000</td>\n",
       "      <td>2.904000</td>\n",
       "      <td>1.155000</td>\n",
       "      <td>1.404000</td>\n",
       "      <td>1.037000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.257638</td>\n",
       "      <td>12.058814</td>\n",
       "      <td>1.08312</td>\n",
       "      <td>2822.736876</td>\n",
       "      <td>1.580023</td>\n",
       "      <td>1.208306</td>\n",
       "      <td>1.118715</td>\n",
       "      <td>0.70808</td>\n",
       "      <td>0.477706</td>\n",
       "      <td>1.103718</td>\n",
       "      <td>1.050209</td>\n",
       "      <td>11.375469</td>\n",
       "      <td>0.705601</td>\n",
       "      <td>0.531264</td>\n",
       "      <td>0.577654</td>\n",
       "      <td>0.653614</td>\n",
       "      <td>0.362086</td>\n",
       "      <td>0.490943</td>\n",
       "      <td>0.188856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>250.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1365.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>27.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>2319.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3972.250000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>18424.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          checking     duration     history        amount      savings  \\\n",
       "count  1000.000000  1000.000000  1000.00000   1000.000000  1000.000000   \n",
       "mean      2.577000    20.903000     2.54500   3271.258000     2.105000   \n",
       "std       1.257638    12.058814     1.08312   2822.736876     1.580023   \n",
       "min       1.000000     4.000000     0.00000    250.000000     1.000000   \n",
       "25%       1.000000    12.000000     2.00000   1365.500000     1.000000   \n",
       "50%       2.000000    18.000000     2.00000   2319.500000     1.000000   \n",
       "75%       4.000000    24.000000     4.00000   3972.250000     3.000000   \n",
       "max       4.000000    72.000000     4.00000  18424.000000     5.000000   \n",
       "\n",
       "          employed     installp     marital        coapp     resident  \\\n",
       "count  1000.000000  1000.000000  1000.00000  1000.000000  1000.000000   \n",
       "mean      3.384000     2.973000     2.68200     1.145000     2.845000   \n",
       "std       1.208306     1.118715     0.70808     0.477706     1.103718   \n",
       "min       1.000000     1.000000     1.00000     1.000000     1.000000   \n",
       "25%       3.000000     2.000000     2.00000     1.000000     2.000000   \n",
       "50%       3.000000     3.000000     3.00000     1.000000     3.000000   \n",
       "75%       5.000000     4.000000     3.00000     1.000000     4.000000   \n",
       "max       5.000000     4.000000     4.00000     3.000000     4.000000   \n",
       "\n",
       "          property          age        other      housing      existcr  \\\n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000   \n",
       "mean      2.358000    35.546000     2.675000     1.929000     1.407000   \n",
       "std       1.050209    11.375469     0.705601     0.531264     0.577654   \n",
       "min       1.000000    19.000000     1.000000     1.000000     1.000000   \n",
       "25%       1.000000    27.000000     3.000000     2.000000     1.000000   \n",
       "50%       2.000000    33.000000     3.000000     2.000000     1.000000   \n",
       "75%       3.000000    42.000000     3.000000     2.000000     2.000000   \n",
       "max       4.000000    75.000000     3.000000     3.000000     4.000000   \n",
       "\n",
       "               job      depends     telephon      foreign  \n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  \n",
       "mean      2.904000     1.155000     1.404000     1.037000  \n",
       "std       0.653614     0.362086     0.490943     0.188856  \n",
       "min       1.000000     1.000000     1.000000     1.000000  \n",
       "25%       3.000000     1.000000     1.000000     1.000000  \n",
       "50%       3.000000     1.000000     1.000000     1.000000  \n",
       "75%       3.000000     1.000000     2.000000     1.000000  \n",
       "max       4.000000     2.000000     2.000000     2.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "26d603a4-94aa-4494-84b5-0ef5fbca1293",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [checking, duration, history, purpose, amount, savings, employed, installp, marital, coapp, resident, property, age, other, housing, existcr, job, depends, telephon, foreign, good_bad]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 21 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df[credit_df.duplicated()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7040e34d-6198-4167-b0a8-8438d10cf89e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "checking    0\n",
       "duration    0\n",
       "history     0\n",
       "purpose     0\n",
       "amount      0\n",
       "savings     0\n",
       "employed    0\n",
       "installp    0\n",
       "marital     0\n",
       "coapp       0\n",
       "resident    0\n",
       "property    0\n",
       "age         0\n",
       "other       0\n",
       "housing     0\n",
       "existcr     0\n",
       "job         0\n",
       "depends     0\n",
       "telephon    0\n",
       "foreign     0\n",
       "good_bad    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "dcd3dff9-0f66-4dbc-9547-b5de4946ed05",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "purpose\n",
      "3    280\n",
      "0    234\n",
      "2    181\n",
      "1    103\n",
      "9     97\n",
      "6     50\n",
      "5     22\n",
      "4     12\n",
      "X     12\n",
      "8      9\n",
      "Name: count, dtype: int64\n",
      "good_bad\n",
      "good    700\n",
      "bad     300\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 通过value_counts()函数对类别型变量进行频数统计\n",
    "print(credit_df.purpose.value_counts())\n",
    "print(credit_df.good_bad.value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c791c2a4-96f8-453d-8d01-e699edfd3949",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>purpose_0</th>\n",
       "      <th>purpose_1</th>\n",
       "      <th>purpose_2</th>\n",
       "      <th>purpose_3</th>\n",
       "      <th>purpose_4</th>\n",
       "      <th>purpose_5</th>\n",
       "      <th>purpose_6</th>\n",
       "      <th>purpose_8</th>\n",
       "      <th>purpose_9</th>\n",
       "      <th>purpose_X</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   purpose_0  purpose_1  purpose_2  purpose_3  purpose_4  purpose_5  \\\n",
       "0      False      False      False       True      False      False   \n",
       "1      False      False      False       True      False      False   \n",
       "2      False      False      False      False      False      False   \n",
       "3      False      False       True      False      False      False   \n",
       "4       True      False      False      False      False      False   \n",
       "\n",
       "   purpose_6  purpose_8  purpose_9  purpose_X  \n",
       "0      False      False      False      False  \n",
       "1      False      False      False      False  \n",
       "2       True      False      False      False  \n",
       "3      False      False      False      False  \n",
       "4      False      False      False      False  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 把类别型变量进行独热编码(1->N)\n",
    "checking = pd.get_dummies(credit_df.checking,prefix='checking')\n",
    "history = pd.get_dummies(credit_df.history,prefix='history')\n",
    "purpose = pd.get_dummies(credit_df.purpose,prefix='purpose')\n",
    "savings = pd.get_dummies(credit_df.savings,prefix='savings')\n",
    "employed = pd.get_dummies(credit_df.employed,prefix='employed')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "marital = pd.get_dummies(credit_df.marital,prefix='marital')\n",
    "coapp = pd.get_dummies(credit_df.coapp,prefix='coapp')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "resident = pd.get_dummies(credit_df.resident,prefix='resident')\n",
    "property = pd.get_dummies(credit_df.property,prefix='property')\n",
    "housing = pd.get_dummies(credit_df.housing,prefix='housing')\n",
    "existcr = pd.get_dummies(credit_df.existcr,prefix='existcr')\n",
    "job = pd.get_dummies(credit_df.job,prefix='job')\n",
    "depends = pd.get_dummies(credit_df.depends,prefix='depends')\n",
    "telephon = pd.get_dummies(credit_df.telephon,prefix='telephon')\n",
    "foreign = pd.get_dummies(credit_df.foreign,prefix='foreign')\n",
    "\n",
    "# 随便查看一个编码后的数据\n",
    "purpose.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9237cc58-be8a-4ee2-b3e0-a877c8a5bd15",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>duration</th>\n",
       "      <th>amount</th>\n",
       "      <th>age</th>\n",
       "      <th>checking_1</th>\n",
       "      <th>checking_2</th>\n",
       "      <th>checking_3</th>\n",
       "      <th>checking_4</th>\n",
       "      <th>history_0</th>\n",
       "      <th>history_1</th>\n",
       "      <th>history_2</th>\n",
       "      <th>...</th>\n",
       "      <th>job_1</th>\n",
       "      <th>job_2</th>\n",
       "      <th>job_3</th>\n",
       "      <th>job_4</th>\n",
       "      <th>depends_1</th>\n",
       "      <th>depends_2</th>\n",
       "      <th>telephon_1</th>\n",
       "      <th>telephon_2</th>\n",
       "      <th>foreign_1</th>\n",
       "      <th>foreign_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>1169</td>\n",
       "      <td>67</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>48</td>\n",
       "      <td>5951</td>\n",
       "      <td>22</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>12</td>\n",
       "      <td>2096</td>\n",
       "      <td>49</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>42</td>\n",
       "      <td>7882</td>\n",
       "      <td>45</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>24</td>\n",
       "      <td>4870</td>\n",
       "      <td>53</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 72 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   duration  amount  age  checking_1  checking_2  checking_3  checking_4  \\\n",
       "0         6    1169   67        True       False       False       False   \n",
       "1        48    5951   22       False        True       False       False   \n",
       "2        12    2096   49       False       False       False        True   \n",
       "3        42    7882   45        True       False       False       False   \n",
       "4        24    4870   53        True       False       False       False   \n",
       "\n",
       "   history_0  history_1  history_2  ...  job_1  job_2  job_3  job_4  \\\n",
       "0      False      False      False  ...  False  False   True  False   \n",
       "1      False      False       True  ...  False  False   True  False   \n",
       "2      False      False      False  ...  False   True  False  False   \n",
       "3      False      False       True  ...  False  False   True  False   \n",
       "4      False      False      False  ...  False  False   True  False   \n",
       "\n",
       "   depends_1  depends_2  telephon_1  telephon_2  foreign_1  foreign_2  \n",
       "0       True      False       False        True       True      False  \n",
       "1       True      False        True       False       True      False  \n",
       "2      False       True        True       False       True      False  \n",
       "3      False       True        True       False       True      False  \n",
       "4      False       True        True       False       True      False  \n",
       "\n",
       "[5 rows x 72 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用concat()函数把转换后的数据对象全部合并在一起变成新的数据对象，命名为trainData_X\n",
    "trainData_X = pd.concat([credit_df.duration, credit_df.amount, credit_df.age, checking, history, purpose, savings, employed, installp, marital, coapp, installp, resident, property, housing, existcr, job, depends, telephon, foreign], axis=1)\n",
    "trainData_X.head()\n",
    "# 72 columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f495f29b-fd48-4aba-8bab-f3e7943c10cb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    700\n",
       "1    300\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "credit_df['target'] = 0\n",
    "credit_df.loc[(credit_df.good_bad == 'bad'), 'target'] = 1\n",
    "\n",
    "trainData_y = credit_df['target'] \n",
    "trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3d6b5f61-da35-406d-9dfb-74de7f54193e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(700, 72) (300, 72)\n"
     ]
    }
   ],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=2048)\n",
    "\n",
    "# 查看一下拆分后的train和test的shape，确认拆分正确\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7684d47b-75b1-4e5b-b526-7b44fa60ccd9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "818d6db2-6ced-407e-bc7c-0a5bb4006db2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.75      0.95      0.84       199\n",
      "           1       0.80      0.36      0.49       101\n",
      "\n",
      "    accuracy                           0.75       300\n",
      "   macro avg       0.77      0.66      0.67       300\n",
      "weighted avg       0.76      0.75      0.72       300\n",
      "\n",
      "[[190   9]\n",
      " [ 65  36]]\n",
      "0.7729986566495846\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1ba8e63f3e0>]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1ba90b69640>]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'False Positive Rate')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'True Positive Rate')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Receiver operating characteristic example')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1ba909f6660>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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E+TPn9/i+j169KBFixYsXLiQe/fuYWtry7Vr13B3d+frr7+mQIEC3Lp1i59++onq1asTHBxMiRIlUhV7rVq1WLduHU2bNqVnz5706tULwJzwnDhxglq1alG4cGEmTJiAl5cX69evp3///oSHhzNy5EiLWIcPH07NmjWZMWMGVlZWeHh4EBYWluyeNm/eHJPJxLhx4yhcuDDh4eHs3LnTnISn9bNw+PBhXn75ZfLnz88XX3xB8eLFCQ0NZc2aNcTHxz/x2KSkJF577TW2bdvG0KFDqVWrFhcvXmTkyJHUr1+f/fv34+DgwMcff8y2bdvo2rUrwcHB+Pn5MW/ePH766Sdmz55NuXLlAIiLi+PWrVsMGTKEggULEh8fz99//80bb7zBvHnz6NKli8X1f//9d4KDg/n6668xGAx8/PHHtGjRgq5du3L+/HmmTJlCZGQkgwcP5s033+TQoUMW/9/CwsLo0KEDw4YN44svvuCPP/5gzJgx3L59mylTpjzxfqX1d5B4TkqIx8ybN08Bavfu3SohIUFFR0erdevWKS8vL1W3bl2VkJBg3rdkyZKqUqVKFmVKKdWyZUvl7e2tTCaTUkqpHj16KFtbW3XixIknXnfs2LHKyspK7du3z6J8xYoVClBr1641l/n5+amuXbuat9esWaMA9ddff5nLEhMTlY+Pj3rzzTfNZb1791Z58uRRFy9etLjGt99+qwB1/PhxpZRSISEhClBFixZV8fHxz7plat26dQpQ48aNsygPCgpSgPrxxx8tYjcYDOrQoUMW+7766qvKxcVF3bt3L833A1Curq7q1q1bT43TZDKphIQE9cUXXyh3d3eVlJRkfq1MmTKqXr16yY55cC/mzZtnLhs5cmSK77dfv37K3t7efN4//vhDAWr69OkW+40dO1YBauTIkU+N94svvlCA2rBhwxP3eRBfuXLlVGJiorl87969ClBLlix54rGJiYnq7t27ysnJSU2ePNlc/uD/QJcuXZ4a34NzxMfHq+LFi6tBgwalKfabN28+8T40adJE+fr6qsjISIvyDz74QNnb25t/1ps2bVKAqlu3brJzPHht06ZNSimlwsPDFaAmTZr01PeUls9Cw4YNVd68edWNGzeees7HLVmyRAFq5cqVFuX79u1TgJo2bZq5LDw8XPn6+qpq1aqpgwcPKkdHR/XOO+889fyJiYkq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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))\n",
    "                       \n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds =roc_curve(y_test, y_test_prob[:,1])\n",
    "\n",
    "# print AUC值\n",
    "auc = auc(fpr, tpr)\n",
    "print(auc)\n",
    "\n",
    "# plot ROC曲线\n",
    "plt.plot(fpr, tpr, lw=2, label='ROC curve (area = {:.2f})'.format(auc))\n",
    "plt.plot([0,1], [0, 1], 'r--')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9aaad30c-2c80-4ee0-b26c-d7a39315ffcf",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    199\n",
       "1    101\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e246edd8-75f0-466b-a48e-4824b61f0d0a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=10)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=10)\n",
    "dtree.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "18b4781d-7f21-4b60-8ea6-d1340b6193df",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.11861079, 0.16996256, 0.05550595, 0.        , 0.00724386,\n",
       "       0.        , 0.12837154, 0.02479451, 0.04281327, 0.011716  ,\n",
       "       0.00436754, 0.01140908, 0.01235984, 0.01640178, 0.00660248,\n",
       "       0.        , 0.        , 0.00651948, 0.00177266, 0.        ,\n",
       "       0.02925399, 0.        , 0.04946573, 0.02740458, 0.00705467,\n",
       "       0.        , 0.        , 0.01188446, 0.00178414, 0.00792297,\n",
       "       0.        , 0.02052866, 0.        , 0.        , 0.01138645,\n",
       "       0.01880982, 0.        , 0.        , 0.01510577, 0.        ,\n",
       "       0.01730297, 0.01044812, 0.01523301, 0.        , 0.        ,\n",
       "       0.00871527, 0.        , 0.01487256, 0.        , 0.        ,\n",
       "       0.        , 0.02308981, 0.03523319, 0.02143833, 0.        ,\n",
       "       0.        , 0.        , 0.00814935, 0.        , 0.00578104,\n",
       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
       "       0.00547168, 0.00380303, 0.00633838, 0.        , 0.0050707 ,\n",
       "       0.        , 0.        ])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtree.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "4c2400e8-c88a-47dd-8674-d0f8fbc5e445",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>amount</td>\n",
       "      <td>0.169963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>checking_4</td>\n",
       "      <td>0.128372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>duration</td>\n",
       "      <td>0.118611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>0.055506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>savings_1</td>\n",
       "      <td>0.049466</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>history_1</td>\n",
       "      <td>0.042813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>property_2</td>\n",
       "      <td>0.035233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>purpose_9</td>\n",
       "      <td>0.029254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>savings_2</td>\n",
       "      <td>0.027405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>history_0</td>\n",
       "      <td>0.024795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>property_1</td>\n",
       "      <td>0.023090</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>property_3</td>\n",
       "      <td>0.021438</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>employed_5</td>\n",
       "      <td>0.020529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>installp_4</td>\n",
       "      <td>0.018810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>coapp_1</td>\n",
       "      <td>0.017303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>purpose_1</td>\n",
       "      <td>0.016402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>coapp_3</td>\n",
       "      <td>0.015233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>marital_3</td>\n",
       "      <td>0.015106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>resident_1</td>\n",
       "      <td>0.014873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>purpose_0</td>\n",
       "      <td>0.012360</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       feature  importance\n",
       "1       amount    0.169963\n",
       "6   checking_4    0.128372\n",
       "0     duration    0.118611\n",
       "2          age    0.055506\n",
       "22   savings_1    0.049466\n",
       "8    history_1    0.042813\n",
       "52  property_2    0.035233\n",
       "20   purpose_9    0.029254\n",
       "23   savings_2    0.027405\n",
       "7    history_0    0.024795\n",
       "51  property_1    0.023090\n",
       "53  property_3    0.021438\n",
       "31  employed_5    0.020529\n",
       "35  installp_4    0.018810\n",
       "40     coapp_1    0.017303\n",
       "13   purpose_1    0.016402\n",
       "42     coapp_3    0.015233\n",
       "38   marital_3    0.015106\n",
       "47  resident_1    0.014873\n",
       "12   purpose_0    0.012360"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = dtree.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "321eaba8-4dfc-4c09-ae36-d72a9569cc15",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-4 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-4 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-4 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-4 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-4 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-4 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DecisionTreeClassifier(max_depth=3)\n",
      "0.7171428571428573\n",
      "{'criterion': 'gini', 'max_depth': 3}\n"
     ]
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'criterion':['gini','entropy'],\n",
    "    'max_depth':[1,2,3,4,5,6,7,8,9,10,11,12]\n",
    "}\n",
    "\n",
    "dtree = tree.DecisionTreeClassifier()\n",
    "dtree_search = GridSearchCV(dtree, parameters, scoring='accuracy', cv=5)\n",
    "dtree_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "print(dtree_search.best_estimator_)\n",
    "print(dtree_search.best_score_)\n",
    "print(dtree_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7f7c3417-f15c-4a4f-91b5-3559bddaf627",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "c7cbabe6-18fd-4a1d-9824-db00399a50a5",
   "metadata": {},
   "source": [
    "## 练习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2732f5dd-371b-4f8a-a23c-33f79c37c4db",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "data_df = pd.read_csv(\"D:/Pythonwork/homework/homework/irisdata.txt\",header=None)\n",
    "data_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c039c72a-ef9e-428c-9e13-82a7300d8d20",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_df['target'] = 0\n",
    "data_df.loc[(data_df[4] == 'Iris-versicolor'), 'target'] = 1\n",
    "data_df.loc[(data_df[4] == 'Iris-virginica'), 'target'] = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d26b7c7e-1f1d-41c5-8fba-ae713aca6d3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "Data_X=data_df.iloc[0:150,0:4]\n",
    "Data_X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "584a9e45-0e01-42ab-a349-8b3718bc491f",
   "metadata": {},
   "outputs": [],
   "source": [
    "Data_Y= data_df['target'] \n",
    "Data_Y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14de9ce0-f1cf-4168-966f-8e6506610a2e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(Data_X, Data_Y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f7b4577-d4fe-4853-bea6-e26d1c9046d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier     ##决策树\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=6)\n",
    "dtree.fit(X_train,y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5be05ac8-b1ee-4083-8050-ee2652d0cfc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "dtree.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "be9254ae-83b0-4447-bffe-f021d77379d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = dtree.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d4785ee-84e9-4493-b67e-b3ccb5fdaed2",
   "metadata": {},
   "source": [
    "## 混淆矩阵： 横纵轴和对角线\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16dd61f5-bbe6-481e-b77a-8a6a599acced",
   "metadata": {},
   "source": [
    "## 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3b910dea-81fd-4360-b7be-62a6ad402ff2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>47</td>\n",
       "      <td>100</td>\n",
       "      <td>27</td>\n",
       "      <td>81</td>\n",
       "      <td>57</td>\n",
       "      <td>37</td>\n",
       "      <td>26</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23</td>\n",
       "      <td>56</td>\n",
       "      <td>53</td>\n",
       "      <td>100</td>\n",
       "      <td>90</td>\n",
       "      <td>40</td>\n",
       "      <td>98</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>89</td>\n",
       "      <td>27</td>\n",
       "      <td>100</td>\n",
       "      <td>42</td>\n",
       "      <td>75</td>\n",
       "      <td>29</td>\n",
       "      <td>45</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>37</td>\n",
       "      <td>0</td>\n",
       "      <td>69</td>\n",
       "      <td>2</td>\n",
       "      <td>100</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>57</td>\n",
       "      <td>31</td>\n",
       "      <td>68</td>\n",
       "      <td>72</td>\n",
       "      <td>90</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>76</td>\n",
       "      <td>75</td>\n",
       "      <td>50</td>\n",
       "      <td>51</td>\n",
       "      <td>28</td>\n",
       "      <td>25</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>7</td>\n",
       "      <td>92</td>\n",
       "      <td>5</td>\n",
       "      <td>68</td>\n",
       "      <td>19</td>\n",
       "      <td>45</td>\n",
       "      <td>86</td>\n",
       "      <td>34</td>\n",
       "      <td>100</td>\n",
       "      <td>45</td>\n",
       "      <td>74</td>\n",
       "      <td>23</td>\n",
       "      <td>67</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>67</td>\n",
       "      <td>49</td>\n",
       "      <td>83</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>81</td>\n",
       "      <td>80</td>\n",
       "      <td>60</td>\n",
       "      <td>60</td>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "      <td>33</td>\n",
       "      <td>20</td>\n",
       "      <td>47</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7489</th>\n",
       "      <td>0</td>\n",
       "      <td>82</td>\n",
       "      <td>9</td>\n",
       "      <td>59</td>\n",
       "      <td>56</td>\n",
       "      <td>34</td>\n",
       "      <td>41</td>\n",
       "      <td>0</td>\n",
       "      <td>10</td>\n",
       "      <td>30</td>\n",
       "      <td>3</td>\n",
       "      <td>67</td>\n",
       "      <td>42</td>\n",
       "      <td>96</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7490</th>\n",
       "      <td>49</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>70</td>\n",
       "      <td>24</td>\n",
       "      <td>56</td>\n",
       "      <td>100</td>\n",
       "      <td>65</td>\n",
       "      <td>86</td>\n",
       "      <td>85</td>\n",
       "      <td>44</td>\n",
       "      <td>77</td>\n",
       "      <td>21</td>\n",
       "      <td>38</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7491</th>\n",
       "      <td>100</td>\n",
       "      <td>98</td>\n",
       "      <td>60</td>\n",
       "      <td>100</td>\n",
       "      <td>24</td>\n",
       "      <td>87</td>\n",
       "      <td>3</td>\n",
       "      <td>58</td>\n",
       "      <td>35</td>\n",
       "      <td>51</td>\n",
       "      <td>58</td>\n",
       "      <td>26</td>\n",
       "      <td>36</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7492</th>\n",
       "      <td>59</td>\n",
       "      <td>65</td>\n",
       "      <td>91</td>\n",
       "      <td>100</td>\n",
       "      <td>84</td>\n",
       "      <td>96</td>\n",
       "      <td>72</td>\n",
       "      <td>50</td>\n",
       "      <td>51</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>45</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7493</th>\n",
       "      <td>0</td>\n",
       "      <td>78</td>\n",
       "      <td>29</td>\n",
       "      <td>100</td>\n",
       "      <td>94</td>\n",
       "      <td>86</td>\n",
       "      <td>70</td>\n",
       "      <td>48</td>\n",
       "      <td>42</td>\n",
       "      <td>11</td>\n",
       "      <td>32</td>\n",
       "      <td>0</td>\n",
       "      <td>25</td>\n",
       "      <td>36</td>\n",
       "      <td>100</td>\n",
       "      <td>40</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>7494 rows × 17 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       0    1   2    3    4    5    6    7   8   9    10  11   12  13   14  \\\n",
       "0      47  100  27   81   57   37   26    0   0  23   56  53  100  90   40   \n",
       "1       0   89  27  100   42   75   29   45  15  15   37   0   69   2  100   \n",
       "2       0   57  31   68   72   90  100  100  76  75   50  51   28  25   16   \n",
       "3       0  100   7   92    5   68   19   45  86  34  100  45   74  23   67   \n",
       "4       0   67  49   83  100  100   81   80  60  60   40  40   33  20   47   \n",
       "...   ...  ...  ..  ...  ...  ...  ...  ...  ..  ..  ...  ..  ...  ..  ...   \n",
       "7489    0   82   9   59   56   34   41    0  10  30    3  67   42  96  100   \n",
       "7490   49  100   0   70   24   56  100   65  86  85   44  77   21  38    6   \n",
       "7491  100   98  60  100   24   87    3   58  35  51   58  26   36   0    0   \n",
       "7492   59   65  91  100   84   96   72   50  51   8    0   0   45   1  100   \n",
       "7493    0   78  29  100   94   86   70   48  42  11   32   0   25  36  100   \n",
       "\n",
       "       15  16  \n",
       "0      98   8  \n",
       "1       6   2  \n",
       "2       0   1  \n",
       "3       0   4  \n",
       "4       0   1  \n",
       "...   ...  ..  \n",
       "7489  100   5  \n",
       "7490    0   4  \n",
       "7491    5   5  \n",
       "7492    0   1  \n",
       "7493   40   7  \n",
       "\n",
       "[7494 rows x 17 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "data_df = pd.read_csv(\"pendigits.txt\",header=None)\n",
    "data_df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6260708-e525-49c2-baa6-dd24ed59599f",
   "metadata": {},
   "source": [
    "#### 数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "75dbf1e8-f29a-4661-8a67-51160a554879",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 7494 entries, 0 to 7493\n",
      "Data columns (total 17 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   0       7494 non-null   int64\n",
      " 1   1       7494 non-null   int64\n",
      " 2   2       7494 non-null   int64\n",
      " 3   3       7494 non-null   int64\n",
      " 4   4       7494 non-null   int64\n",
      " 5   5       7494 non-null   int64\n",
      " 6   6       7494 non-null   int64\n",
      " 7   7       7494 non-null   int64\n",
      " 8   8       7494 non-null   int64\n",
      " 9   9       7494 non-null   int64\n",
      " 10  10      7494 non-null   int64\n",
      " 11  11      7494 non-null   int64\n",
      " 12  12      7494 non-null   int64\n",
      " 13  13      7494 non-null   int64\n",
      " 14  14      7494 non-null   int64\n",
      " 15  15      7494 non-null   int64\n",
      " 16  16      7494 non-null   int64\n",
      "dtypes: int64(17)\n",
      "memory usage: 995.4 KB\n"
     ]
    }
   ],
   "source": [
    "data_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "7945b381-7fa7-4cf2-b14e-fd59500337ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>37.384307</td>\n",
       "      <td>84.679343</td>\n",
       "      <td>40.005604</td>\n",
       "      <td>82.889512</td>\n",
       "      <td>50.878303</td>\n",
       "      <td>65.044436</td>\n",
       "      <td>51.471844</td>\n",
       "      <td>44.599680</td>\n",
       "      <td>57.129971</td>\n",
       "      <td>34.069122</td>\n",
       "      <td>61.417401</td>\n",
       "      <td>35.782092</td>\n",
       "      <td>54.699760</td>\n",
       "      <td>35.800774</td>\n",
       "      <td>46.813718</td>\n",
       "      <td>28.565386</td>\n",
       "      <td>4.430878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>33.322024</td>\n",
       "      <td>16.848420</td>\n",
       "      <td>26.256025</td>\n",
       "      <td>19.638582</td>\n",
       "      <td>34.927201</td>\n",
       "      <td>27.377341</td>\n",
       "      <td>30.680075</td>\n",
       "      <td>30.659478</td>\n",
       "      <td>33.680340</td>\n",
       "      <td>27.459989</td>\n",
       "      <td>37.130762</td>\n",
       "      <td>27.495836</td>\n",
       "      <td>22.599781</td>\n",
       "      <td>33.223611</td>\n",
       "      <td>41.531794</td>\n",
       "      <td>35.811094</td>\n",
       "      <td>2.876981</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>76.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>17.000000</td>\n",
       "      <td>48.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>30.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>31.000000</td>\n",
       "      <td>89.000000</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>89.000000</td>\n",
       "      <td>56.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>54.000000</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>60.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>74.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>53.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>61.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>58.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>86.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>88.000000</td>\n",
       "      <td>55.000000</td>\n",
       "      <td>98.000000</td>\n",
       "      <td>57.000000</td>\n",
       "      <td>69.000000</td>\n",
       "      <td>48.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>9.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                0            1            2            3            4   \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     37.384307    84.679343    40.005604    82.889512    50.878303   \n",
       "std      33.322024    16.848420    26.256025    19.638582    34.927201   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%       5.000000    76.000000    20.000000    70.000000    17.000000   \n",
       "50%      31.000000    89.000000    39.000000    89.000000    56.000000   \n",
       "75%      61.000000   100.000000    58.000000   100.000000    81.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                5            6            7            8            9   \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     65.044436    51.471844    44.599680    57.129971    34.069122   \n",
       "std      27.377341    30.680075    30.659478    33.680340    27.459989   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%      48.000000    28.000000    22.000000    30.000000     7.000000   \n",
       "50%      71.000000    54.000000    42.000000    60.000000    33.000000   \n",
       "75%      86.000000    75.000000    65.000000    88.000000    55.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                10           11           12           13           14  \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     61.417401    35.782092    54.699760    35.800774    46.813718   \n",
       "std      37.130762    27.495836    22.599781    33.223611    41.531794   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%      25.000000    12.000000    41.000000     7.000000     0.000000   \n",
       "50%      74.000000    32.000000    53.000000    28.000000    39.000000   \n",
       "75%      98.000000    57.000000    69.000000    48.000000   100.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                15           16  \n",
       "count  7494.000000  7494.000000  \n",
       "mean     28.565386     4.430878  \n",
       "std      35.811094     2.876981  \n",
       "min       0.000000     0.000000  \n",
       "25%       0.000000     2.000000  \n",
       "50%       8.000000     4.000000  \n",
       "75%      51.000000     7.000000  \n",
       "max     100.000000     9.000000  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "9800749c-ed49-44e9-80f5-296f9fb855d0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]\n",
       "Index: []"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_df[data_df.duplicated()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "20786bbb-4ae8-4d58-88cf-d8bb219690c8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     0\n",
       "1     0\n",
       "2     0\n",
       "3     0\n",
       "4     0\n",
       "5     0\n",
       "6     0\n",
       "7     0\n",
       "8     0\n",
       "9     0\n",
       "10    0\n",
       "11    0\n",
       "12    0\n",
       "13    0\n",
       "14    0\n",
       "15    0\n",
       "16    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_df.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a8d6f8b-c3da-417c-8721-f5f46fc552d2",
   "metadata": {},
   "source": [
    "#### 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "60eeaca5-1802-4da4-b433-7b73bcae1bc2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>47</td>\n",
       "      <td>100</td>\n",
       "      <td>27</td>\n",
       "      <td>81</td>\n",
       "      <td>57</td>\n",
       "      <td>37</td>\n",
       "      <td>26</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23</td>\n",
       "      <td>56</td>\n",
       "      <td>53</td>\n",
       "      <td>100</td>\n",
       "      <td>90</td>\n",
       "      <td>40</td>\n",
       "      <td>98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>89</td>\n",
       "      <td>27</td>\n",
       "      <td>100</td>\n",
       "      <td>42</td>\n",
       "      <td>75</td>\n",
       "      <td>29</td>\n",
       "      <td>45</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>37</td>\n",
       "      <td>0</td>\n",
       "      <td>69</td>\n",
       "      <td>2</td>\n",
       "      <td>100</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>57</td>\n",
       "      <td>31</td>\n",
       "      <td>68</td>\n",
       "      <td>72</td>\n",
       "      <td>90</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>76</td>\n",
       "      <td>75</td>\n",
       "      <td>50</td>\n",
       "      <td>51</td>\n",
       "      <td>28</td>\n",
       "      <td>25</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>7</td>\n",
       "      <td>92</td>\n",
       "      <td>5</td>\n",
       "      <td>68</td>\n",
       "      <td>19</td>\n",
       "      <td>45</td>\n",
       "      <td>86</td>\n",
       "      <td>34</td>\n",
       "      <td>100</td>\n",
       "      <td>45</td>\n",
       "      <td>74</td>\n",
       "      <td>23</td>\n",
       "      <td>67</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>67</td>\n",
       "      <td>49</td>\n",
       "      <td>83</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>81</td>\n",
       "      <td>80</td>\n",
       "      <td>60</td>\n",
       "      <td>60</td>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "      <td>33</td>\n",
       "      <td>20</td>\n",
       "      <td>47</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   0    1   2    3    4    5    6    7   8   9    10  11   12  13   14  15\n",
       "0  47  100  27   81   57   37   26    0   0  23   56  53  100  90   40  98\n",
       "1   0   89  27  100   42   75   29   45  15  15   37   0   69   2  100   6\n",
       "2   0   57  31   68   72   90  100  100  76  75   50  51   28  25   16   0\n",
       "3   0  100   7   92    5   68   19   45  86  34  100  45   74  23   67   0\n",
       "4   0   67  49   83  100  100   81   80  60  60   40  40   33  20   47   0"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Data_X=data_df.iloc[:,0:16]\n",
    "Data_X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "f3c30198-e667-4c85-8a26-330f6785fa65",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16\n",
       "2    780\n",
       "4    780\n",
       "0    780\n",
       "1    779\n",
       "7    778\n",
       "6    720\n",
       "5    720\n",
       "8    719\n",
       "9    719\n",
       "3    719\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Data_Y= data_df[16] \n",
    "Data_Y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "afc4588a-ec64-4f4a-9ffc-5c19bf3228b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(Data_X, Data_Y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "a0096f56-e667-4b77-b199-990c230ab0b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5245, 16) (2249, 16)\n"
     ]
    }
   ],
   "source": [
    "# 查看一下拆分后的train和test的shape，确认拆分正确\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d6f5bb1-26d1-41a3-b336-7d5af491d28a",
   "metadata": {},
   "source": [
    "#### 决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "a9e1afdc-9b43-4301-a0e6-6921e2f8ac1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-16 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-16 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-16 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-16 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-16 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-16 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-16 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-16 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-16 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-16 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-16 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-16 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-16 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-16 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-16 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-16\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=6)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-28\" type=\"checkbox\" checked><label for=\"sk-estimator-id-28\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=6)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=6)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier     ##决策树\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=6)\n",
    "dtree.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "791bf321-984f-441f-87e0-85fbea68d227",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>13</td>\n",
       "      <td>0.125186</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "      <td>0.120017</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9</td>\n",
       "      <td>0.115022</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>15</td>\n",
       "      <td>0.098664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "      <td>0.093968</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>10</td>\n",
       "      <td>0.092982</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.092647</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.090741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>0.056755</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>0.039750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "      <td>0.034022</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.017037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>12</td>\n",
       "      <td>0.012957</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.005776</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "      <td>0.002456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.002020</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    feature  importance\n",
       "13       13    0.125186\n",
       "14       14    0.120017\n",
       "9         9    0.115022\n",
       "15       15    0.098664\n",
       "8         8    0.093968\n",
       "10       10    0.092982\n",
       "3         3    0.092647\n",
       "4         4    0.090741\n",
       "5         5    0.056755\n",
       "6         6    0.039750\n",
       "7         7    0.034022\n",
       "0         0    0.017037\n",
       "12       12    0.012957\n",
       "2         2    0.005776\n",
       "11       11    0.002456\n",
       "1         1    0.002020"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = dtree.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "3439bf4e-b32d-4b46-a35c-d81f8c40f21a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-17 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-17 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-17 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-17 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-17 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-17 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-17 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-17 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-17 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-17 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-17 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-17 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-17 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-17 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-17 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-17 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-17 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-17 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-17\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
       "                                       13, 14, 15]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-29\" type=\"checkbox\" ><label for=\"sk-estimator-id-29\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
       "                                       13, 14, 15]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-30\" type=\"checkbox\" ><label for=\"sk-estimator-id-30\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-31\" type=\"checkbox\" ><label for=\"sk-estimator-id-31\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
       "                                       13, 14, 15]},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DecisionTreeClassifier(criterion='entropy', max_depth=12)\n",
      "0.9563393708293614\n",
      "{'criterion': 'entropy', 'max_depth': 12}\n"
     ]
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'criterion':['gini','entropy'],\n",
    "    'max_depth':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\n",
    "}\n",
    "\n",
    "dtree = tree.DecisionTreeClassifier()\n",
    "dtree_search = GridSearchCV(dtree, parameters, scoring='accuracy', cv=5)\n",
    "dtree_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "print(dtree_search.best_estimator_)\n",
    "print(dtree_search.best_score_)\n",
    "print(dtree_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "af05bf4a-fc32-474c-b5c2-723593f80ff4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-18 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-18 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-18 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-18 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-18 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-18 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-18 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-18 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-18 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-18 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-18 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-18 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-18 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-18 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-18 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-18 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-18 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-18 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-18\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(criterion=&#x27;entropy&#x27;, max_depth=13)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-32\" type=\"checkbox\" checked><label for=\"sk-estimator-id-32\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(criterion=&#x27;entropy&#x27;, max_depth=13)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(criterion='entropy', max_depth=13)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##优化\n",
    "dtree = DecisionTreeClassifier(criterion='entropy',max_depth=13)\n",
    "dtree.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "7df692b9-1a4c-49ed-8617-27f08db4dc0b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9595375722543352\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.98      0.97      0.98       245\n",
      "           1       0.94      0.93      0.94       244\n",
      "           2       0.92      0.95      0.94       244\n",
      "           3       0.98      0.95      0.97       191\n",
      "           4       0.99      0.97      0.98       232\n",
      "           5       0.94      0.98      0.96       212\n",
      "           6       0.97      0.97      0.97       216\n",
      "           7       0.95      0.94      0.95       228\n",
      "           8       0.96      0.96      0.96       226\n",
      "           9       0.98      0.97      0.97       211\n",
      "\n",
      "    accuracy                           0.96      2249\n",
      "   macro avg       0.96      0.96      0.96      2249\n",
      "weighted avg       0.96      0.96      0.96      2249\n",
      "\n",
      "[[238   0   0   0   0   1   3   0   2   1]\n",
      " [  0 228  10   1   2   0   2   1   0   0]\n",
      " [  0   8 231   0   0   0   1   4   0   0]\n",
      " [  0   2   1 182   0   5   0   1   0   0]\n",
      " [  0   0   1   0 225   1   0   4   0   1]\n",
      " [  0   0   2   0   0 208   0   0   0   2]\n",
      " [  0   2   1   0   0   2 210   0   1   0]\n",
      " [  0   1   3   3   0   0   0 215   5   1]\n",
      " [  4   0   0   0   0   2   1   2 217   0]\n",
      " [  1   1   1   0   1   3   0   0   0 204]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "print(dtree.score(X_test,y_test))\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = dtree.predict(X_test)\n",
    "y_test_prob = dtree.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "15783984-ccd1-411d-86f0-7e7e195d396d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#来一个更美观一些误分类矩阵\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3954cf57-ddb8-489a-82f2-00fb19c94857",
   "metadata": {},
   "source": [
    "#### 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "566d3aaf-d901-40e3-b228-016a4dd97f4e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-19 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-19 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-19 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-19 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-19 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-19 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-19 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-19 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-19 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-19 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-19 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-19 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-19 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-19 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-19 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-19 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-19 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-19 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-19\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-33\" type=\"checkbox\" checked><label for=\"sk-estimator-id-33\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "95d56ad2-379f-47e6-a855-773dd5e9c2a8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>13</td>\n",
       "      <td>0.107329</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>15</td>\n",
       "      <td>0.099837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "      <td>0.083007</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9</td>\n",
       "      <td>0.074219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.071285</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>10</td>\n",
       "      <td>0.065598</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "      <td>0.064421</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "      <td>0.063613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.058638</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "      <td>0.055535</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    feature  importance\n",
       "13       13    0.107329\n",
       "15       15    0.099837\n",
       "14       14    0.083007\n",
       "9         9    0.074219\n",
       "4         4    0.071285\n",
       "10       10    0.065598\n",
       "8         8    0.064421\n",
       "7         7    0.063613\n",
       "1         1    0.058638\n",
       "11       11    0.055535"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = rf.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "25c1bb19-d57b-4427-a4f8-6de48e430ca9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-20 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-20 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-20 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-20 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-20 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-20 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-20 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-20 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-20 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-20 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-20 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-20 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-20 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-20 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-20 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-20 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-20 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-20 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-20\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_features&#x27;: [1, 2, 3, 4],\n",
       "                         &#x27;n_estimators&#x27;: [5, 10, 15, 20, 30]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-34\" type=\"checkbox\" ><label for=\"sk-estimator-id-34\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_features&#x27;: [1, 2, 3, 4],\n",
       "                         &#x27;n_estimators&#x27;: [5, 10, 15, 20, 30]},\n",
       "             scoring=&#x27;accuracy&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-35\" type=\"checkbox\" ><label for=\"sk-estimator-id-35\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: RandomForestClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-36\" type=\"checkbox\" ><label for=\"sk-estimator-id-36\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_features': [1, 2, 3, 4],\n",
       "                         'n_estimators': [5, 10, 15, 20, 30]},\n",
       "             scoring='accuracy')"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-21 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-21 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-21 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-21 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-21 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-21 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-21 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-21 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-21 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-21 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-21 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-21 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-21 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-21 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-21 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-21 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-21 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-21 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-21\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=4, n_estimators=30)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-37\" type=\"checkbox\" checked><label for=\"sk-estimator-id-37\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=4, n_estimators=30)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=4, n_estimators=30)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "0.98836987607245"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "{'criterion': 'gini', 'max_features': 4, 'n_estimators': 30}"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'n_estimators':[5,10,15,20,30],\n",
    "    'max_features':[1,2,3,4],\n",
    "    'criterion':['gini','entropy']\n",
    "}\n",
    "\n",
    "rf = RandomForestClassifier()\n",
    "rf_search = GridSearchCV(rf, parameters, scoring='accuracy', cv=5)\n",
    "rf_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "rf_search.best_estimator_\n",
    "rf_search.best_score_\n",
    "rf_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "e044334e-e346-44de-a4a7-296871806f89",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-22 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-22 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-22 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-22 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-22 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-22 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-22 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-22 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-22 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-22 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-22 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-22 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-22 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-22 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-22 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-22 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-22 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-22 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-22\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-38\" type=\"checkbox\" checked><label for=\"sk-estimator-id-38\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=3, n_estimators=30)"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##优化\n",
    "rf = RandomForestClassifier(criterion='gini',max_features=3,n_estimators=30)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "90fed763-f2b9-4db7-a3c5-7973f299f7dc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9888839484215207\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      0.99      1.00       245\n",
      "           1       0.98      0.98      0.98       244\n",
      "           2       0.99      0.98      0.98       244\n",
      "           3       0.99      0.98      0.99       191\n",
      "           4       1.00      0.98      0.99       232\n",
      "           5       0.99      1.00      0.99       212\n",
      "           6       1.00      1.00      1.00       216\n",
      "           7       0.99      0.99      0.99       228\n",
      "           8       0.99      1.00      1.00       226\n",
      "           9       0.97      1.00      0.99       211\n",
      "\n",
      "    accuracy                           0.99      2249\n",
      "   macro avg       0.99      0.99      0.99      2249\n",
      "weighted avg       0.99      0.99      0.99      2249\n",
      "\n",
      "[[243   0   0   0   0   0   0   0   2   0]\n",
      " [  0 238   3   1   0   1   1   0   0   0]\n",
      " [  0   4 239   0   0   0   0   1   0   0]\n",
      " [  0   1   0 188   0   0   0   2   0   0]\n",
      " [  0   0   0   0 227   0   0   0   0   5]\n",
      " [  0   0   0   0   0 211   0   0   0   1]\n",
      " [  0   0   0   0   0   1 215   0   0   0]\n",
      " [  0   1   0   1   0   0   0 226   0   0]\n",
      " [  0   0   0   0   0   0   0   0 226   0]\n",
      " [  0   0   0   0   0   0   0   0   0 211]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "print(rf.score(X_test,y_test))\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "473f84ac-fad6-4b38-8301-aa14391565bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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06fTtm1bUlJS2LdvH1qtliFDhjB37lzeeeedYvMEBASwceNG/v3vf9OkSRMOHz5MVlYWU6ZMYdOmTfj4+LicY+DAgSQlJTF58mSaNm3KoUOHOH36NM2bN+epp57i3nvvLTb9M888wwsvvECLFi04cOAAmzZtYtOmTcXuAFTLthWx2WykpqaW+afoTtMmTZqwbds2Ro0ahV6v59ChQxgMBl566SVWr16Nt3f598C1bNmSnTt3Mnz4cE6dOsX58+fp2LEjH3/8Me+//36p89x+++0cOHCAf/7zn0RHR3P48GEOHDiAn58ft99+O5999hnPPPOM29surg0aRSnlarQQQgjhAeRITgghhMeSIieEEMJjSZETQgjhsaTICSGE8FhS5IQQQngsKXJCCCE8lhQ5IYQQHkuKXAUKCwvLfP2HEEIIdZMiV44DBw5wzz33MGDAACZMmMDixYtrOxJg78dPCCFExaTIleHIkSNcf/316PV6Bg0axPHjx3njjTeYMGFCred6++23OX/+fK3mEEKIa4F061UKRVF47rnnOHz4MEuWLAEgNzeXBQsW8NFHH9GmTRu+/vrrGs919OhRevToQXp6Os888wxTp04lPDy8xnMIIcS1Qo7kSqHRaDh79iwXLlxwDPPz8+PBBx/kn//8J8nJyUybNq1GM+Xk5PDaa68xYsQI3nvvPWbPns3rr79e7NUjQgghiiu/6+86SFEUNBoNcXFxHD58mEOHDtG6dWvA/uLHMWPGcOTIETZs2MClS5eIiIiokVxarZYuXboQFhbGXXfdRb169bj77rsBePrpp+WITgghSiGnK8tw7NgxevbsyfDhw3nnnXcIDAx0jDt//jyNGjVi6dKljjdA14ScnBzH248Bvv76a8aOHcuTTz7JM888Q1hYGDabjZMnT9KsWbMayyWEEGolR3JlaN68Od988w233HILfn5+vPjii46jJb1eT+fOnQkODq7RTEUFzmq1otVqueuuu1AUhXHjxqHRaHjiiSf4v//7P06ePMkXX3yBn59fjeYTQgi1kSJXjv79+7NkyRLGjBnDuXPnGDNmDB06dOCLL77gzJkzNG/evFZyeXl5oSgKNpuNu+++G41Gw7333kt8fDzHjh1j165dUuCEEAI5XemUhIQEpk6dSkpKCt7e3uh0OhYvXkznzp1rNVfRrtNoNNx0003s3buX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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#来一个更美观一些误分类矩阵\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "02c4aab2-f294-414d-b222-d533ee7f3dca",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
